package vm


// 其它类型指令，MOVE和JMP


import "api"


// MOVE指令
func move(i Instruction, vm api.LuaVM) {

	a, b, _ := i.ABC()
	a += 1
	b += 1

	vm.Copy(b, a)
}


// JMP指令(iAsBx模式)执行无条件跳转
// 该指令往往和TEST等指令配合使用，但是也可能单独出现
// `JMP`指令除了可以进行无条件跳转之外，还兼顾着闭合处于开启状态的`Upvalue`的责任
// 如果某个块内部定义的局部变量已经被嵌套函数捕获，那么当这些局部变量退出作用域（也就是块结束）时
// 编译器会生成一条`JMP`指令，指示虚拟机闭合相应的`Upvalue`
// if (A) close all upvalues >= R(A) - 1
// 如果该作用域内有一个局部变量被捕获
// 那么所有的局部变量都会变成upvalue存入upvalues列表中
func jmp(i Instruction, vm api.LuaVM) {

	a, sBx := i.AsBx()
	vm.AddPC(sBx)

	if a != 0 {
		
		vm.CloseUpvalues(a)

	}
}